using namespace std;

#include "../IncludesServidor.h"
#include "ProductorJugadorX.h"

ProductorJugadorX::ProductorJugadorX(bool atributo) : Thread(atributo){
	this->jugador 	= NULL;
	this->conexion 	= NULL;
}

ProductorJugadorX::~ProductorJugadorX() {
	free(this);
}

//Seters
void ProductorJugadorX::setJugador(t_jugador  *jugador){
	this->jugador = jugador;
}

void ProductorJugadorX::setConexion(Socket *conexion){
	this->conexion = conexion;
}

//Getters
t_jugador *ProductorJugadorX::getJugador(){
	return this->jugador;
};

//Manejador de señales de interrupcion.
void ProductorJugadorX::signalHandler(int signal){
	//Informo la finalizacion por sysout
	cout<< "[INFO] - Se cierra el hilo de escucha al jugador "<< endl;
	//Cierro el thread.
	pthread_exit(NULL);
}

void ProductorJugadorX::run (){
	/* Me attacho a la señal que envia el server para finalizar. */
	signal(SIGUSR1, ProductorJugadorX::signalHandler);

	/* Mientras el cliente este activo */
	while (Partida::getInstance()->isActivo() && this->jugador->conectado) {

		/* Recibo el comando del cliente como un puntero void */
		t_accion *accionRecibida = (t_accion *)(this->conexion->read(sizeof(t_accion), this->jugador->socket_id));

		/* Si no esta vacia la accion y la partida no esta parada, lo encolo en el singleton del juego. */
		if (accionRecibida != NULL)
			Partida::getInstance()->encolarAccionAProcesar(*accionRecibida);
		else
			/* Sino muestro error */
			cout << "[AVISO] - Se descarta accion: " << accionRecibida->id_accion << endl;
	}

	//Cierro el thread.
	pthread_exit(NULL);
}
	
